STM32CubeIDE

您所在的位置:网站首页 stm32 can接收不用中断 STM32CubeIDE

STM32CubeIDE

2024-07-03 01:03| 来源: 网络整理| 查看: 265

目录

一、CAN模块配置流程

1.1 图形化界面设置can的波特率和相关工作模式

1.2 代码设置can的滤波器和中断

二、代码详解

2.1 CAN信息发送函数

2.2 CAN信息接收函数

2.3 main()函数

2.4 CAN接收回调函数

三、 总结

硬件条件:带有CAN总线接口的STM32开发板/工控板。

实现功能:

stm32轮询发送can信息(数据帧、标准帧);stm32在中断回调中接收刚刚自己发出的can信息。

本文默认读者已经有了如下的基本知识和技能:

对can协议和stm32的bxCAN有了一定的了解,如Time Quantum、四种工作模式、过滤器及其配置参数的意义等;会在stm32cubeide中图形化配置芯片的调试串口、时钟和代码自动生成。

下面直接开始工程(工程中只讲述与can有关的地方)。

一、CAN模块配置流程

本文以STM32F103C8T6芯片为例。

STM32中CAN的配置分为两大部分:图形化界面设置can的波特率、相关工作模式和中断优先级;代码设置can的滤波器和使能FIFO中断。现具体讲述着两大部分。

1.1 图形化界面设置can的波特率和相关工作模式 首先,使能can模块;接着调整“Prescaler(for Time Quantum)”参数、“Time Quanta in Bit Segment 1”参数和“Time Quanta in Bit Segment 2”参数,使得波特率Baud Rate达到合适的值;然后在Operating Mode选项中选择回环模式(当然工作模式的选择要看具体应用了);之后,“Parameter Settings”页面里剩下的其它参数,如果没有什么特殊需求的话,保持默认就可以了。见图1-1。 图1-1

     5. 进入"NVIC Settings"中勾选RX0的中断使能,如图1-2;并在软件左侧NVIC栏里设置它的中断优先级,如图1-3。

图1-2

  

图1-3

     6. 到这里,图形化页面里能配置的都配置完了。当然,can滤波器的配置还没有进行,这是在下一个部分里。

1.2 代码设置can的滤波器和中断

在软件自动生成的代码里找到can.c文件,这里面是工程对can配置的部分信息,与刚才图形化界面里我们的配置信息保持一致。

图个方便,我们直接在void MX_CAN_Init(void)函数里添加上滤波器的配置并使能对应的接收FIFO中断,如图1-3。这里别忘了在该函数外面定义需要的结构体变量!!!

图1-3

到此,can的配置全部OK。

现在只需要在main()里调用函数HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan),就可以开启can使它工作了。

二、代码详解 2.1 CAN信息发送函数

要想can发送信息,需要用到函数:HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox),我在这里把它进行再封装一下,变得更好用:

CAN_TxHeaderTypeDef Tx_pHeader; /* * @brief: CAN Send Message. * @param: "TxData[]" stored the message of ready to send, which length must between 0 and 8. * @param: "length" stored the number of the data (one data is 8 bit) of ready to send. * @retval: Tx_Error: send error; other: the mailbox which has been used, this parameter can be a CAN_TX_MAILBOX0, * CAN_TX_MAILBOX1, * CAN_TX_MAILBOX2. */ uint32_t CAN_TX_Message(uint8_t TxData[], uint8_t length) { uint32_t TxMailboxNumber = 0x00000000U; // 存储本次发送所使用邮箱的邮箱号 Tx_pHeader.StdId = 0x000; // 以此ID发送 Tx_pHeader.ExtId = 0x0000; // 扩展ID(此处无用) Tx_pHeader.IDE = CAN_ID_STD; // 标准帧 Tx_pHeader.RTR = CAN_RTR_DATA; // 数据帧 Tx_pHeader.DLC = length; // 发送数据的长度 Tx_pHeader.TransmitGlobalTime = DISABLE; if(HAL_CAN_AddTxMessage(&hcan, &Tx_pHeader, TxData, &TxMailboxNumber) != HAL_OK) { return Tx_Error; } return TxMailboxNumber; } 2.2 CAN信息接收函数

同样,接受can上的信息,需要用到函数:HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]),我也对其进行再封装:

CAN_RxHeaderTypeDef Rx_pHeader; /* * @brief: CAN Receive Message. * @param: "RxData[]" will store the message which has been received, which length must between 0 and 8. * @retval: receive status. */ uint32_t CAN_RX_Message(uint8_t RxData[]) { uint8_t aData[8]; // 缓存接收到的信息 Rx_pHeader.StdId = 0x000; // 接收ID(此处无用,can接收所有的ID号) Rx_pHeader.ExtId = 0x0000; Rx_pHeader.IDE = CAN_ID_STD; // 接收标准帧 Rx_pHeader.DLC = 8; // 接收8个8bit数据 Rx_pHeader.RTR = CAN_RTR_DATA; // 接收数据帧 Rx_pHeader.FilterMatchIndex = 0; // 使用0号过滤器 Rx_pHeader.Timestamp = 0; if(HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &Rx_pHeader, aData) != HAL_OK) { return Rx_Error; } else { // 取出接收到的信息 for(uint8_t i = 0; iInstance == CAN1) { if(CAN_RX_Message(RxData) != Rx_OK) { // 接收信息失败 printf("MCU Received CAN Data ERROR!!!"); printf("\n\r"); printf("\n\r"); } else { // 接受信息成功,处理数据 printf("MCU Received CAN Data: "); for(uint8_t i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3